/**
 * 二进制相加
 * @param a 
 * @param b 
 */

const addBinary = (a: string, b: string): string => {
    // 从尾开始比较
    let l = a.length - 1,
        r = b.length - 1,
        str = '',
        plus = 0; // 进位

    while (l >= 0 || r >= 0) {
        let add = (l < 0 ? 0 : Number(a[l])) + (r < 0 ? 0 : Number(b[r])) + plus;

        // 有进位
        let isPlus = add > 1
        let w = isPlus ? add % 2 : add
        plus = isPlus ? 1 : 0

        // 拼接到新的str中
        str = w + str;

        l--;
        r--;
    }

    // 还有进位
    if (plus === 1) {
        str = 1 + str;
    }

    return str
};


const addBinary2 = (a: string, b: string): string => {
    // x存储结果, y存储进位
    let x = parseInt(a, 2),
        y = parseInt(b, 2);

    while (y) {
        // 结果
        let ans = x ^ y;

        // 保存进位
        y = (x & y) << 1

        // 保存结果
        x = ans
    }

    return x.toString(2);
};


